﻿using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Collections.Generic;
using System.Text;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Web;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting;
using System.Web.Services;
using System.IO;
using System.Collections;
using System.ServiceModel.Activation;
using System.ServiceModel.Description;
using System.Threading;
using System.Diagnostics;
using System.Reflection;
using System.Web.SessionState;

using PickGold.Arguments;
using PickGold.Base.Proxies;

namespace PickGold.Base.Remoting
{
	class MethodInvokerWcfClient : ClientBase<IMethodInvoker>, ICloseable, IMethodInvokerClient, IMethodInvoker
	{
		public static bool OnlyRemote = false;

		#region ctor

		/// <summary>
		/// 使用应用程序配置文件中的默认目标终结点初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <exception cref="System.InvalidOperationException">配置文件中没有默认的终结点信息，或者文件中有多个终结点，或者没有配置文件。</exception>
		public MethodInvokerWcfClient() : base() { }
		/// <summary>
		/// 通过使用 callbackInstance 作为双工对话中的回调对象来初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端应用程序用以侦听来自所连接服务的消息的回调对象。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">配置文件中没有默认的终结点信息，或者文件中有多个终结点，或者没有配置文件。</exception>
		public MethodInvokerWcfClient(InstanceContext callbackInstance) : base(callbackInstance) { }
		/// <summary>
		/// 使用应用程序配置文件中由 endpointConfigurationName 指定的配置信息来初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <exception cref="System.ArgumentNullException">指定的终结点信息为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerWcfClient(string endpointConfigurationName) : base(endpointConfigurationName) { }
		/// <summary>
		/// 使用指定的绑定和目标地址初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="binding">用于调用服务的绑定。</param>
		/// <param name="remoteAddress">服务终结点的地址。</param>
		/// <exception cref="System.ArgumentNullException">绑定为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		public MethodInvokerWcfClient(Binding binding, EndpointAddress remoteAddress) : base(binding, remoteAddress) { }
		/// <summary>
		/// 使用指定的回调服务和终结点配置信息初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端用以侦听来自所连接服务的消息的回调对象。</param>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerWcfClient(InstanceContext callbackInstance, string endpointConfigurationName) : base(callbackInstance, endpointConfigurationName) { }
		/// <summary>
		/// 使用指定的目标地址和终结点信息初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerWcfClient(string endpointConfigurationName, EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerWcfClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">回调服务。</param>
		/// <param name="binding">用于调用服务的绑定。</param>
		/// <param name="remoteAddress">服务终结点的地址。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">绑定为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		public MethodInvokerWcfClient(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress) : base(callbackInstance, binding, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端用以侦听来自所连接服务的消息的回调对象。</param>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerWcfClient(InstanceContext callbackInstance, string endpointConfigurationName, EndpointAddress remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端用以侦听来自所连接服务的消息的回调对象。</param>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerWcfClient(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { }

		#endregion

		public byte[] Invoke(byte[] message)
		{
			return base.Channel.Invoke(message);
		}

		public IAsyncResult BeginAsyncInvoke(byte[] message, AsyncCallback callback, object state)
		{
			return base.Channel.BeginAsyncInvoke(message, callback, state);
		}

		public byte[] EndAsyncInvoke(IAsyncResult result)
		{
			return base.Channel.EndAsyncInvoke(result);
		}

		public DateTime GetDateTime(string dateTime)
		{
			return this.Channel.GetDateTime(dateTime);
		}
	}

	class MethodInvokerDuplexWcfClient : DuplexClientBase<IMethodInvokerDuplex>, ICloseable, IMethodInvokerClient, IMethodInvoker, IMethodInvokerDuplex
	{
		public static IMethodInvoker CallbackInstance = new MethodInvoker();

		#region ctor

		/// <summary>
		/// 使用应用程序配置文件中的默认目标终结点初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <exception cref="System.InvalidOperationException">配置文件中没有默认的终结点信息，或者文件中有多个终结点，或者没有配置文件。</exception>
		public MethodInvokerDuplexWcfClient() : base(CallbackInstance) { }
		/// <summary>
		/// 通过使用 callbackInstance 作为双工对话中的回调对象来初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端应用程序用以侦听来自所连接服务的消息的回调对象。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">配置文件中没有默认的终结点信息，或者文件中有多个终结点，或者没有配置文件。</exception>
		public MethodInvokerDuplexWcfClient(InstanceContext callbackInstance) : base(callbackInstance) { }
		/// <summary>
		/// 使用应用程序配置文件中由 endpointConfigurationName 指定的配置信息来初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <exception cref="System.ArgumentNullException">指定的终结点信息为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerDuplexWcfClient(string endpointConfigurationName) : base(CallbackInstance, endpointConfigurationName) { }
		/// <summary>
		/// 使用指定的绑定和目标地址初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="binding">用于调用服务的绑定。</param>
		/// <param name="remoteAddress">服务终结点的地址。</param>
		/// <exception cref="System.ArgumentNullException">绑定为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		public MethodInvokerDuplexWcfClient(Binding binding, EndpointAddress remoteAddress) : base(CallbackInstance, binding, remoteAddress) { }
		/// <summary>
		/// 使用指定的回调服务和终结点配置信息初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端用以侦听来自所连接服务的消息的回调对象。</param>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerDuplexWcfClient(InstanceContext callbackInstance, string endpointConfigurationName) : base(callbackInstance, endpointConfigurationName) { }
		/// <summary>
		/// 使用指定的目标地址和终结点信息初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerDuplexWcfClient(string endpointConfigurationName, EndpointAddress remoteAddress) : base(CallbackInstance, endpointConfigurationName, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerDuplexWcfClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">回调服务。</param>
		/// <param name="binding">用于调用服务的绑定。</param>
		/// <param name="remoteAddress">服务终结点的地址。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">绑定为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		public MethodInvokerDuplexWcfClient(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress) : base(callbackInstance, binding, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端用以侦听来自所连接服务的消息的回调对象。</param>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerDuplexWcfClient(InstanceContext callbackInstance, string endpointConfigurationName, EndpointAddress remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { }
		/// <summary>
		/// 初始化 System.ServiceModel.ClientBase&lt;TChannel&gt; 类的新实例。
		/// </summary>
		/// <param name="callbackInstance">客户端用以侦听来自所连接服务的消息的回调对象。</param>
		/// <param name="endpointConfigurationName">应用程序配置文件中的终结点的名称。</param>
		/// <param name="remoteAddress">服务的地址。</param>
		/// <exception cref="System.ArgumentNullException">回调实例为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">终结点为 Null。</exception>
		/// <exception cref="System.ArgumentNullException">远程地址为 Null。</exception>
		/// <exception cref="System.InvalidOperationException">无法找到终结点或者终结点协定无效。</exception>
		public MethodInvokerDuplexWcfClient(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { }

		#endregion

		public byte[] Invoke(byte[] message)
		{
			return base.Channel.Invoke(message);
		}

		public IAsyncResult BeginAsyncInvoke(byte[] message, AsyncCallback callback, object state)
		{
			return base.Channel.BeginAsyncInvoke(message, callback, state);
		}

		public byte[] EndAsyncInvoke(IAsyncResult result)
		{
			return base.Channel.EndAsyncInvoke(result);
		}

		public DateTime GetDateTime(string dateTime)
		{
			return this.Channel.GetDateTime(dateTime);
		}
	}
}
